package org.muyu;

import org.muyu.component.AbstractFactory;
import org.muyu.component.ComputerEngineer;
import org.muyu.component.Schema1;

/**
 * 抽象工厂模式
 *
 * 组成部件
 * 1. 抽象工厂【AbstractFactory】 => AbstractFactory规定了工厂的责任就是创建CPU和主板
 * 2. 具体工厂【ConcreteFactory】 => Schema1、Schema2为两种不同的装配方案，也就是两种不同的产品簇，每个方案都涉及到不同种类的CPU和主板
 * 3. 产品对象接口【AbstractProduct】 => CPUApi和MainboardApi分别定义了CPU和主板的责任
 * 4. 产品具体实现【ConcreteProduct】
 *
 * 提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类
 *
 * 案例理解
 * 抽象工厂的核心在于簇，是多个对象耦合的一个产物，单一对象的创建可以使用工厂方法或简单工厂
 * 案例中除了核心组件外，ComputerEngineer也十分重要
 * ComputerEngineer可以理解为外观，通过一个统一的页面让客户端和具体的某个产品进行了分隔，简化了学习的成本
 */
public class Client {
    public static void main(String[] args) {
        //创建装机工程师对象
        ComputerEngineer engineer = new ComputerEngineer();
        //客户选择并创建需要使用的装机方案对象
        AbstractFactory schema = new Schema1();
        //告诉装机工程师自己选择的装机方案，让装机工程师组装电脑
        engineer.makeComputer(schema);
    }
}
